package org.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.example.entity.UserRoleCompanyRelation;

import java.util.List;

@Mapper
public interface UserRoleCompanyRelationMapper extends BaseMapper<UserRoleCompanyRelation> {
    
    /**
     * 根据用户ID删除所有角色关联
     */
    int deleteByUserId(@Param("userId") Long userId);
    
    /**
     * 批量插入用户角色关联
     */
    @Insert({
        "<script>",
        "INSERT INTO user_role_company_relations (user_id, role_id, company_id, is_active)",
        "VALUES",
        "<foreach collection='roleIds' item='rid' separator=','>",
        "(#{userId}, #{rid}, #{companyId}, 1)",
        "</foreach>",
        "</script>"
    })
    int batchInsert(@Param("userId") Long userId, @Param("roleIds") List<Long> roleIds, @Param("companyId") Long companyId);
    
    /**
     * 根据用户ID查询角色ID列表
     */
    @Select("SELECT role_id FROM user_role_company_relations WHERE user_id = #{userId}")
    List<Long> getRoleIdsByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID和公司ID查询角色ID列表（用于租户权限验证）
     */
    @Select("SELECT role_id FROM user_role_company_relations WHERE user_id = #{userId} AND company_id = #{companyId}")
    List<Long> getRoleIdsByUserIdAndCompanyId(@Param("userId") Long userId, @Param("companyId") Long companyId);

    /**
     * 根据用户ID和公司ID查询活跃的角色ID列表（用于租户权限验证，只返回is_active=1的记录）
     */
    @Select("SELECT role_id FROM user_role_company_relations WHERE user_id = #{userId} AND company_id = #{companyId} AND is_active = 1")
    List<Long> getActiveRoleIdsByUserIdAndCompanyId(@Param("userId") Long userId, @Param("companyId") Long companyId);

    /**
     * 根据用户ID查询去重后的公司ID列表（只返回活跃记录）
     */
    @Select("SELECT DISTINCT company_id FROM user_role_company_relations WHERE user_id = #{userId} AND is_active = 1")
    List<Long> getCompanyIdsByUserId(@Param("userId") Long userId);

    /**
     * 根据公司ID查询去重后的角色ID列表
     */
    @Select("SELECT DISTINCT role_id FROM user_role_company_relations WHERE company_id = #{companyId}")
    List<Long> getRoleIdsByCompanyId(@Param("companyId") Long companyId);
    
    /**
     * 统计指定角色下的用户数量（企业端）
     */
    @Select("SELECT COUNT(DISTINCT user_id) FROM user_role_company_relations WHERE role_id = #{roleId} AND company_id = #{companyId} AND is_active = 1")
    int countUsersByRoleIdAndCompanyId(@Param("roleId") Long roleId, @Param("companyId") Long companyId);
    
    /**
     * 将用户从旧角色转移到新角色
     */
    @Update("UPDATE user_role_company_relations SET role_id = #{newRoleId} WHERE role_id = #{oldRoleId} AND company_id = #{companyId}")
    int transferUsersToNewRole(@Param("oldRoleId") Long oldRoleId, @Param("newRoleId") Long newRoleId, @Param("companyId") Long companyId);
    
    /**
     * 根据角色ID禁用所有关联（软删除）
     */
    @Update("UPDATE user_role_company_relations SET is_active = 0 WHERE role_id = #{roleId}")
    int disableByRoleId(@Param("roleId") Long roleId);
    
    /**
     * 根据角色ID统计用户数量（包括所有企业）
     */
    @Select("SELECT COUNT(DISTINCT user_id) FROM user_role_company_relations WHERE role_id = #{roleId} AND is_active = 1")
    int countUsersByRoleId(@Param("roleId") Long roleId);
    
    /**
     * 根据公司ID查询去重后的用户ID列表（不过滤is_active，统一用users.status控制）
     */
    @Select("SELECT DISTINCT user_id FROM user_role_company_relations WHERE company_id = #{companyId}")
    List<Long> getUserIdsByCompanyId(@Param("companyId") Long companyId);

    /**
     * 将某个用户在指定公司的角色关联全部禁用（软删除）
     */
    @Update("UPDATE user_role_company_relations SET is_active = 0 WHERE user_id = #{userId} AND company_id = #{companyId}")
    int disableByUserIdAndCompanyId(@Param("userId") Long userId, @Param("companyId") Long companyId);
}












